# 使用__slots__
# 正常情况下，当我们定义了一个class，创建了一个class的实例后，我们可以给该实例绑定任何属性和方法，这就是动态语言的灵活性。


class Task(object):
    pass


# 尝试给实例绑定一个属性：
t = Task()
t.id = '13731581347'
print(t.id)


# 尝试给实例绑定一个方法：
def set_id(self, id):
    self.id = id


def set_card(self, card):
    self.card = card


from types import MethodType

t.set_id = MethodType(set_id, t)  # 给实例绑定一个方法
t.set_id('454456')
print(t.id)
# 给一个实例绑定的方法，对另一个实例是不起作用的：
t2 = Task()
# print(t2.id) 'Task' object has no attribute 'id'
print('****************给class绑定方***********************')
# 为了给所有实例都绑定方法，可以给class绑定方法：
Task.set_card = MethodType(set_card, Task)
# t3 =  Task()
# t4 =  Task()
# t3.set_card('746544')
# print(t3.card) //不要这么写
t.set_card('746544')
print(t.card)
t2.set_card('2322')
print(t2.card)
print('****************__slots__限制添加属性***********************')


# 使用__slots__,不能随便添加
# 但是，如果我们想要限制实例的属性怎么办？比如，只允许对Student实例添加name和age属性。
class Person(object):
    __slots__ = ('name', 'age')


p = Person()
p.name = 'hi'
p.age = 60
#注意，此时对实例属性有很大影响，
# p.num = 7878
# print(p.num)
# p.set_id = MethodType(set_id, t)  # 给实例绑定一个方法
# t.id='454500'
# print(t.id)

#这样给类实现可以。。。。。。
Person.set_card = MethodType(set_card, Person)
p.set_card('dada')
print(p.card)